package bizctx

import (
	"context"
	"miaoyu/internal/model"
	"miaoyu/internal/service"
)

type sWebSession struct{}

const (
	webSessionKeyUser         = "WebSessionKeyUser"    // 用户信息存放在Session中的Key
	webSessionKeyLoginReferer = "WebSessionKeyReferer" // Referer存储，当已存在该session时不会更新。用于用户未登录时引导用户登录，并在登录后跳转到登录前页面。
	webSessionKeyNotice       = "WebSessionKeyNotice"  // 存放在Session中的提示信息，往往使用后则删除
	webSessionSite            = "WebSessionSite"       // 存放在Session中的提示信息，往往使用后则删除
)

func init() {
	service.RegisterWebSession(NewWebSession())
}

func NewWebSession() *sWebSession {
	return &sWebSession{}
}

// SetUser 设置用户Session.
func (s *sWebSession) SetUser(ctx context.Context, user *model.ContextUser) error {
	return service.BizCtx().Get(ctx).Session.Set(webSessionKeyUser, user)
}

// GetUser 获取当前登录的用户信息对象，如果用户未登录返回nil。
func (s *sWebSession) GetUser(ctx context.Context) *model.ContextUser {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		v, _ := customCtx.Session.Get(webSessionKeyUser)
		if !v.IsNil() {
			var user *model.ContextUser
			_ = v.Struct(&user)
			return user
		}
	}
	return &model.ContextUser{}
}

// RemoveUser 删除用户Session。
func (s *sWebSession) RemoveUser(ctx context.Context) error {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		return customCtx.Session.Remove(webSessionKeyUser)
	}
	return nil
}

// SetLoginReferer 设置LoginReferer.
func (s *sWebSession) SetLoginReferer(ctx context.Context, referer string) error {
	if s.GetLoginReferer(ctx) == "" {
		customCtx := service.BizCtx().Get(ctx)
		if customCtx != nil {
			return customCtx.Session.Set(webSessionKeyLoginReferer, referer)
		}
	}
	return nil
}

// GetLoginReferer 获取LoginReferer.
func (s *sWebSession) GetLoginReferer(ctx context.Context) string {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		return customCtx.Session.MustGet(webSessionKeyLoginReferer).String()
	}
	return ""
}

// RemoveLoginReferer 删除LoginReferer.
func (s *sWebSession) RemoveLoginReferer(ctx context.Context) error {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		return customCtx.Session.Remove(webSessionKeyLoginReferer)
	}
	return nil
}

// SetNotice 设置Notice
func (s *sWebSession) SetNotice(ctx context.Context, message *model.SessionNotice) error {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		return customCtx.Session.Set(webSessionKeyNotice, message)
	}
	return nil
}

// GetNotice 获取Notice
func (s *sWebSession) GetNotice(ctx context.Context) (*model.SessionNotice, error) {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		var message *model.SessionNotice
		v, err := customCtx.Session.Get(webSessionKeyNotice)
		if err != nil {
			return nil, err
		}
		if err = v.Scan(&message); err != nil {
			return nil, err
		}
		return message, nil
	}
	return nil, nil
}

// RemoveNotice 删除Notice
func (s *sWebSession) RemoveNotice(ctx context.Context) error {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		return customCtx.Session.Remove(webSessionKeyNotice)
	}
	return nil
}

// SetSite 设置SetSiteId
func (s *sWebSession) SetSite(ctx context.Context, site *model.SessionSite) error {
	customCtx := service.BizCtx().Get(ctx)

	if customCtx != nil {

		return customCtx.Session.Set(webSessionSite, site)
	}
	return nil
}

// GetSite 获取GetSiteId
func (s *sWebSession) GetSite(ctx context.Context) (*model.SessionSite, error) {
	customCtx := service.BizCtx().Get(ctx)
	if customCtx != nil {
		var site *model.SessionSite
		v, err := customCtx.Session.Get(webSessionSite)
		if err != nil {
			return nil, err
		}
		if err = v.Scan(&site); err != nil {
			return nil, err
		}
		return site, nil
	}
	return nil, nil
}
func (s *sWebSession) IsLogin(ctx context.Context) (*model.ContextUser, bool) {
	user := s.GetUser(ctx)
	if user.Id == 0 {
		return nil, false
	} else {
		return user, true
	}
}
